package com.example.micro.netty.server.nio.buffer;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 优点：可以让文件直接在内存（堆外内存）中修改，即操作系统不需要拷贝一次
 */
public class MappedByteBufferDemo {

    public static void main(String[] args) throws IOException {

        RandomAccessFile randomAccessFile =
                new RandomAccessFile("/Users/didi/IdeaProjects/nio_file_demo1.txt", "rw");

        //获取对应的Channel
        FileChannel fileChannel = randomAccessFile.getChannel();

        /**
         * 参数1：FileChannel.MapMode.READ_WRITE  使用读写模式
         * 参数2：0  可以直接修改的起始位置
         * 参数3：5  是映射到内存的大小，即将文件 多少个字节映射到内存
         * 可以直接修改的范围是 [0-5) 左闭右开
         */
        MappedByteBuffer mappedByteBuffer =
                fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

        //当前mappedByteBuffer 真实类型为 DirectByteBuffer
        mappedByteBuffer.put(0, (byte) 'H');
        mappedByteBuffer.put(3, (byte) 'L');

        randomAccessFile.close();

    }

}
